/*
 * @title traitement.h
 * @brief Fonctions qui traitent les instructions.
 * @author Nathalie Kauv & Laura Martellotto
 *
 * @date 17 déc. 2011
 */

#ifndef TRAITEMENT_H_
#define TRAITEMENT_H_

#include "registres.h"
#include "memCentrale.h"


// ------- LOAD --------

/**
 * Instruction LOAD
 * Destination REGISTRE
 * SOURCE IMMEDIAT
 * Exemple : LOAD R3, #3
 *          R3 = 3
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void loadRegImm(unsigned source, unsigned dest);

/**
 * Instruction LOAD
 * Destination REGISTRE
 * SOURCE DIRECT
 * Exemple : LOAD R3, [4]
 *          R3 = [3]
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void loadRegDir(unsigned source, unsigned dest);

/**
 * Instruction LOAD
 * Destination REGISTRE
 * SOURCE INDIRECT
 * Exemple : LOAD R3, [R4]
 *          R3 = [R4]
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void loadRegInd(unsigned source, unsigned dest);

// ------- STORE --------

/**
 * Instruction STORE
 * Destination INDIRECT
 * SOURCE REGISTRE
 * Exemple : STORE [R5], R3
 *          [R5] = R3
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void storeDirImm(unsigned source, unsigned dest);

/**
 * Instruction STORE
 * Destination DIRECT
 * SOURCE IMMEDIAT
 * Exemple : STORE [5], #6
 *          [5] = 6
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void storeDirReg(unsigned source, unsigned dest);

/**
 * Instruction STORE
 * Destination DIRECT
 * SOURCE REGISTRE
 * Exemple : STORE [3], R5
 *          [3] = R5
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void storeIndImm(unsigned source, unsigned dest);

/**
 * Instruction STORE
 * Destination INDIRECT
 * SOURCE IMMEDIAT
 * Exemple : STORE [R5], #3
 *          [R5] = 3
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void storeIndReg(unsigned source, unsigned dest);

// ------- ADD --------

/**
 * Instruction ADD
 * Destination REGISTRE
 * SOURCE REGISTRE
 * Exemple : ADD R4, R5
 *          R4 = R4 + R5
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void addRegReg(unsigned source, unsigned dest);


/**
 * Instruction ADD
 * Destination REGISTRE
 * SOURCE IMMEDIAT
 * Exemple : ADD R4, #3
 *          R4 = R4 + 3
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void addRegImm(unsigned source, unsigned dest);

/**
 * Instruction ADD
 * Destination REGISTRE
 * SOURCE DIRECT
 * Exemple : ADD R4, [6]
 *          R4 = R4 + [6]
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void addRegDir(unsigned source, unsigned dest);

/**
 * Instruction ADD
 * Destination REGISTRE
 * SOURCE INDIRECT
 * Exemple : ADD R4, [R6]
 *          R4 = R4 + [R6]
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void addRegInd(unsigned source, unsigned dest);

// ------- SUB --------

/**
 * Instruction SUB
 * Destination REGISTRE
 * SOURCE REGISTRE
 * Exemple : SUB R4, R5
 *          R4 = R4 - R5
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void subRegReg(unsigned source, unsigned dest);

/**
 * Instruction SUB
 * Destination REGISTRE
 * SOURCE IMMEDIAT
 * Exemple : SUB R4, #3
 *          R4 = R4 - 3
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void subRegImm(unsigned source, unsigned dest);

/**
 * Instruction SUB
 * Destination REGISTRE
 * SOURCE DIRECT
 * Exemple : SUB R4, [6]
 *          R4 = R4 - [6]
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void subRegDir(unsigned source, unsigned dest);

/**
 * Instruction SUB
 * Destination REGISTRE
 * SOURCE INDIRECT
 * Exemple : SUB R4, [R6]
 *          R4 = R4 - [R6]
 * @param source Source de l'instruction
 * @param dest Destination de l'instruction
 */
void subRegInd(unsigned source, unsigned dest);

// ------- JMP --------

/**
 * Instruction JMP
 * SOURCE IMMEDIAT
 * Exemple : JMP #5
 *          PC <- 5
 * @param source Source de l'instruction
 */
void jmpImm(unsigned source);

// ------- JEQ --------

/**
 * Instruction JEQ
 * SOURCE IMMEDIAT
 * Exemple : JEQ #5
 *          PC <- 5     si  SR = 0
 * @param source Source de l'instruction
 */
void jeqImm(unsigned source);

// ------- CALL --------

/**
 * Instruction CALL
 * SOURCE IMMEDIAT
 * Exemple : CALL #5
 *          [SP] <- PC
 *          SP <- SP - 1
 *          PC <- 5
 * @param source Source de l'instruction
 */
void callImm(unsigned source);

// ------- RET --------

/**
 * Instruction RET
 * Exemple : RET
 *          SP = SP + 1
 *          PC <- [SP]
 */
void ret();

// ------- PUSH --------

/**
 * Instruction PUSH
 * SOURCE REGISTRE
 * Exemple : push R5
 *          [SP] <- R5
 *          SP = SP - 1
 * @param source Source de l'instruction
 */
void pushReg(unsigned source);

/**
 * Instruction PUSH
 * SOURCE IMMEDIAT
 * Exemple : push #5
 *          [SP] <- 5
 *          SP = SP - 1
 * @param source Source de l'instruction
 */
void pushImm(unsigned source);

/**
 * Instruction PUSH
 * SOURCE DIRECT
 * Exemple : push [5]
 *          [SP] <- [5]
 *          SP = SP - 1
 * @param source Source de l'instruction
 */
void pushDir(unsigned source);

/**
 * Instruction PUSH
 * SOURCE INDIRECT
 * Exemple : push [R5]
 *          [SP] <- [R5]
 *          SP = SP - 1
 * @param source Source de l'instruction
 */
void pushInd(unsigned source);

// ------- POP --------

/**
 * Instruction POP
 * DESTINATION REGISTRE
 * Exemple : pop R5
 *          SP = SP + 1
 *          R5 <- [SP]
 * @param dest Destination de l'instruction
 */
void popReg(unsigned dest);

/**
 * Instruction POP
 * DESTINATION DIRECT
 * Exemple : pop [5]
 *          SP = SP + 1
 *          [5] <- [SP]
 * @param dest Destination de l'instruction
 */
void popDir(unsigned dest);

/**
 * Instruction POP
 * DESTINATION INDIRECT
 * Exemple : pop [R5]
 *          SP = SP + 1
 *          [R5] <- [SP]
 * @param dest Destination de l'instruction
 */
void popInd(unsigned dest);


// ------- HALT --------

/**
 * Instruction HALT
 * Exemple : halt
 *
 */
void halt();

// -------- AFFICHAGE  --------

/**
 * Affiche les registres et leur contenu respectif
 */
void afficherRegistres();

/**
 * Affiche la mémoire centrale
 */
void afficherMemoire();

// -------- TRAITER LES INSTRUCTIONS  --------

/**
 * Fonction d'appel aux fonctions de traitement LOAD désirées en fonction du mode d'adressage
 * @param codInst La structure mot qui est traitée
 */
void traiterLoad (mot codInst);

/**
 * Fonction d'appel aux fonctions de traitement STORE désirées en fonction du mode d'adressage
 * @param codInst La structure mot qui est traitée
 */
void traiterStore (mot codInst);

/**
 * Fonction d'appel aux fonctions de traitement ADD désirées en fonction du mode d'adressage
 * @param codInst La structure mot qui est traitée
 */
void traiterAdd (mot codInst);

/**
 * Fonction d'appel aux fonctions de traitement SUB désirées en fonction du mode d'adressage
 * @param codInst La structure mot qui est traitée
 */
void traiterSub (mot codInst);

/**
 * Fonction d'appel aux fonctions de traitement JMP désirées en fonction du mode d'adressage
 * @param codInst La structure mot qui est traitée
 */
void traiterJmp (mot codInst);

/**
 * Fonction d'appel aux fonctions de traitement JEQ désirées en fonction du mode d'adressage
 * @param codInst La structure mot qui est traitée
 */
void traiterJeq (mot codInst);

/**
 * Fonction d'appel aux fonctions de traitement CALL désirées en fonction du mode d'adressage
 * @param codInst La structure mot qui est traitée
 */
void traiterCall (mot codInst);

/**
 * Fonction d'appel aux fonctions de traitement PUSH désirées en fonction du mode d'adressage
 * @param codInst La structure mot qui est traitée
 */
void traiterPush (mot codInst);

/**
 * Fonction d'appel aux fonctions de traitement POP désirées en fonction du mode d'adressage
 * @param codInst La structure mot qui est traitée
 */
void traiterPop (mot codInst);



#endif /* TRAITEMENT_H_ */
